目錄
本次使用的是 ESP32-CAM 設備,它是安信可科技發佈小尺寸的攝像頭模組。該模塊可以作為最小系統獨立工作,尺寸僅為 27x40.5x4.5 mm,可廣泛應用於各種物聯網場合,適用於家庭智能設備、工業無線控制、無線監控、QR無線識別,無線定位系統信號以及其它物聯網應用,是物聯網應用的理想解決方案。
圖 1. ESP32-CAM 管腳定義
順道提一下 ESP32-CAM 所使用的單晶片是來自於 ESP32 這一系列的低成本,低功耗的單晶片微控制器,整合了 Wi-Fi 和雙模藍牙。 ESP32 系列採用 Tensilica Xtensa LX 6微處理器,包括雙核心和單核變體,內建天線開關,RF變換器,功率放大器,低雜訊接收放大器,濾波器和電源管理模組。
ESP32 由總部位於上海的中國公司樂鑫信息科技創建和開發,由台積電採用40奈米技術製造。它是 ESP8266 微控制器的後繼產品。而以 ESP32 晶片有製作出多個系列的模塊,分別是 ESP32-S 系列、ESP32-C 系列與ESP32 系列。
而 ESP32 模組還可以細分成以下幾個子系列:
上面所提到的 ESP32-D0WD 晶片的描述是:
代號 | 意義 | 說明 |
---|---|---|
D | 內核 | D=雙核、S=單核 |
0 | 嵌入式 Flash | 0=無、2=16Mbit |
WD | 通信模式 | WD=Wi-Fi b/g/n + BT/BLE 雙頻AD=Wi-Fi a/b/g/n + BT/BLE 雙頻CD=Wi-Fi ac/c/b/g/n + BT/BLE 雙頻 |
因為 ESP32-CAM 內核是 ESP32-S,以下所有的說明來自 ESP32 技術參考手冊。 ESP32 是一個雙核系統,具有兩個哈佛架構(Harvard Architecture) Xtensa LX6 CPU。所有嵌入式記憶體(embedded memory),外部記憶體(external memory)和外圍設備(peripherals)位於這些 CPU 的資料總線和/或指令總線上。
兩個 CPU 的地址映射是對稱的,這意味著它們使用相同的地址訪問相同的記憶體。系統中的多個外設可以通過 DMA (Direct Memory Access 直接記憶體存取,以下簡稱 DMA) 訪問嵌入式記憶體。
這兩個 CPU 被命名為 「PRO_CPU」 和 「APP_CPU」(分別代表「協議(Protocol)」和「應用程序(Application)」),但是,對於大多數用途而言,這兩個 CPU 是可以互換的。
地址空間
嵌入式記憶體
外部記憶體
片外(off-Chip) SPI (Serial Peripheral Interface串行外設接口, 以下簡稱 SPI)存儲器可以映射到可用地址空間作為外部記憶體。部分的嵌入式記憶體可用作該外部記憶體的透明緩存。
外圍設備
直接存取
常用存儲器的介紹:
下圖是 ESP32 系統架構圖,PRO_CPU 和 APP_CPU 面對的是相同的地址空間,可以直接讀取嵌入式記憶體與外圍設備地址,而對於外部記憶體空間,需要透過快取 (Cache) 與記憶體管理單元 (Memory Management Unit, 以下簡稱 MMU) 才能進行存取。
圖 2. ESP32 系統架構
圖 3. ESP32 系統地址對應圖
圖 4. ESP32 系統地址對應表格
ESP32 從上電到執行 Micropython 中間所經歷的啓動流程步驟。
宏觀上,啓動流程可以分為如下 3 個步驟:
一級引導程序
ESP32 SoC (System on a Chip, 簡稱SoC)復位(reset)後,PRO_CPU 會立即開始執行,執行復位向量代碼,而 APP_CPU 仍然保持復位狀態。在啓動過程中,PRO_CPU 會執行所有的初始化操作。APP_CPU 的復位狀態會在應用程序啓動代碼的 call_start_cpu0 函數中失效。復位向量代碼位於 ESP32 的 ROM 裡,所以不能被修改。二級引導程序二進制鏡像會從 flash 的 0x1000 地址處加載。
二級引導程序
ESP-IDF (Espressif IoT Development Framework, 以下簡稱 ESP-IDF) 是樂鑫官方推出的物聯網開發框架,支持 Windows、Linux 和 macOS 作業系統。
下表總結了樂鑫晶片在 ESP-IDF 各版本中的支持狀態,其中 supported 代表已支持,preview 代表目前處於預覽支持狀態。預覽支持狀態通常有時間限制,而且僅適用於測試版晶片。請確保使用與晶片相匹配的 ESP-IDF 版本。
表 1. ESP-IDF 各版本中的支持狀態
晶片 | v4.1 | v4.2 | v4.3 | v4.4 | v5.0 | v5.1 |
---|---|---|---|---|---|---|
ESP32 | supported | supported | supported | supported | supported | supported |
ESP32-S2 | supported | supported | supported | supported | supported | |
ESP32-C3 | supported | supported | supported | supported | ||
ESP32-S3 | supported | supported | supported | |||
ESP32-C2 | supported | supported | ||||
ESP32-C6 | supported | |||||
ESP32-H2 beta1/2 | preview | preview | preview |
使用 ESP-IDF 針對 ESP32 晶片所編譯出來的二進制鏡像,透過燒錄軟體(esptool.py)燒錄到 flash 的 0x1000 偏移地址處,那個二進制鏡像就是二級引導程序。二級引導程序的源碼可以在 ESP-IDF 的 components/bootloader 目錄下找到。ESP-IDF 使用二級引導程序可以增加 flash 分區的靈活性(使用分區表),並且方便實現 flash 加密,安全引導和空中升級(Over The Air, OTA)等功能。
圖 5. ESP-IDF 的二級引導程序源碼所在
當一級引導程序校驗並加載完二級引導程序後,它會從二進制鏡像的頭部找到二級引導程序的入口點,並跳轉過去執行。二級引導程序默認從 flash 的 0x8000 偏移地址處(可配置的值)讀取分區表。引導程序會尋找工廠分區和 OTA 應用程序分區。如果在分區表中找到了 OTA 應用程序分區,引導程序將查詢 otadata 分區以確定應引導哪個分區。
應用程序
應用程序啓動包含了從應用程序開始執行到 app_main 函數在主任務內部執行前的所有過程。可分為三個階段:
端口初始化:端口層的初始化功能會初始化基本的 C 執行環境,並對 SoC 的內部硬件進行了初始配置。
系統初始化:主要的系統初始化任務包括以下
執行主任務:在所有其他組件都初始化後,主任務會被創建,FreeRTOS 調度器開始執行。做完一些初始化任務後,主任務在固件中執行應用程序提供的函數 app_main。
APP CPU 的內核啓動流程
當執行系統初始化時,PRO_CPU 上的代碼會給 APP_CPU 設置好入口地址,解除其復位狀態,然後等待 APP_CPU 上執行的代碼設置一個全局標誌,以表明 APP_CPU 已經正常啓動。